#include "../../Headers/UI/mainwindow.h"
#include "ui_mainwindow.h"

#include "../../Headers/UI/aboutprogrammdialog.h"
#include "../../Headers/UI/clientsdialog.h"
#include "../../Headers/UI/typeofroomdialog.h"
#include "../../Headers/UI/advanceoptionsdialog.h"
#include "../../Headers/UI/roomdialog.h"
#include "../../Headers/UI/reservationeditdialog.h"

#include "../../Headers/Classes/reservation.h"
#include "../../Headers/DataAccessors/reservationdataaccessor.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Update();
}

MainWindow::~MainWindow()
{
    delete ui;
    DB db;
    db.RemoveConnection();
}

/**
  О программе
  */
void MainWindow::on_action_2_triggered()
{
    AboutProgrammDialog aboutProgrammDialog;
    aboutProgrammDialog.exec();
}

/**
  Выход
  */
void MainWindow::on_action_3_triggered()
{
    this->close();
}

/**
  Клиенты
  */
void MainWindow::on_action_5_triggered()
{
    ClientsDialog clientsDialog;
    clientsDialog.exec();
    Update();
}

/**
  Типы номеров
  */
void MainWindow::on_action_8_triggered()
{
    TypeOfRoomDialog typeDialog;
    typeDialog.exec();
}

/**
  Дополнительные опции
  */
void MainWindow::on_action_6_triggered()
{
    AdvanceOptionsDialog advancedOptionDialog;
    advancedOptionDialog.exec();
}

/**
  Номера
  */
void MainWindow::on_action_4_triggered()
{
    RoomDialog roomDialog;
    roomDialog.exec();
    Update();
}

void MainWindow::Update()
{
    ReservationDataAccessor reservationData;
    QSqlQueryModel * model = reservationData.getReservationsWithFilter(ui->lineEdit->text());
    model->setHeaderData(1, Qt::Horizontal, trUtf8("Имя клиента"));
    model->setHeaderData(2, Qt::Horizontal, trUtf8("Фамилия клиента"));
    model->setHeaderData(3, Qt::Horizontal, trUtf8("Номер комнаты"));
    model->setHeaderData(4, Qt::Horizontal, trUtf8("Дата заезда"));
    model->setHeaderData(5, Qt::Horizontal, trUtf8("Дата отъезда"));
    ui->tableView->setModel(model);
    ui->tableView->hideColumn(0);
    ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
}

/**
  Создать новую бронь
  */
void MainWindow::on_createButton_clicked()
{
    ReservationEditDialog editDialog;
    editDialog.exec();
    Update();
}

/**
  Изменить бронь
  */
void MainWindow::on_editButton_clicked()
{
    if (checkSelected())
    {
        Reservation *currentReservation = getCurrentReservation();
        //qDebug(QString::number(currentReservation->getOptions().count()).toAscii());
        ReservationEditDialog editDialog(MyUtils::Editing, currentReservation);
        editDialog.exec();
        Update();
    }
}

Reservation * MainWindow::getCurrentReservation()
{
    int row = ui->tableView->currentIndex().row();
    int id = ui->tableView->model()->data(ui->tableView->model()->index(row, 0)).toInt();
    ReservationDataAccessor reservationData;
    return reservationData.getReservation(id);
}

bool MainWindow::checkSelected()
{
    if (ui->tableView->currentIndex().isValid())
    {
        return true;
    }
    else
    {
        QMessageBox msg;
        msg.setIcon(QMessageBox::Information);
        msg.setWindowTitle(trUtf8("Ошибка"));
        msg.setText(trUtf8("Пожалуйста выберите запись для того, чтобы изменить её"));
        msg.exec();
        return false;
    }
}

/**
  Удалить бронь
  */
void MainWindow::on_cancelButton_clicked()
{
    if (checkSelected())
    {
        Reservation *reserv=getCurrentReservation();
        if (reserv != NULL)
        {
            QMessageBox message;
            message.setText(trUtf8("Вы действительно хотите удалить бронь ?"));
            message.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
            message.setDefaultButton(QMessageBox::Ok);
            int result = message.exec();
            if (result == QMessageBox::Ok)
            {
                ReservationDataAccessor reservData;
                reservData.deleteReservation(*reserv);
                Update();
            }
        }

        delete reserv;
    }
}

void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
    on_editButton_clicked();
}

void MainWindow::on_tableView_entered(const QModelIndex &index)
{
    on_editButton_clicked();
}

void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
    Update();
}

/**
  Удалить бронь из меню
  */
void MainWindow::on_action_10_triggered()
{
    on_cancelButton_clicked();
}

/**
  Изменить бронь из меню
  */
void MainWindow::on_action_9_triggered()
{
    on_editButton_clicked();
}
